package com.sqlcheck.model;

import java.util.List;
import java.util.Map;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class SqlStatement {

    private Long id; // 数据库实体ID (对应sql_statements表的id字段)
    private String content; // SQL内容
    private String sourceFile; // 源文件路径
    private Integer lineNumber; // 行号
    private Integer columnNumber; // 列号
    private SqlType sqlType; // SQL类型
    private SourceType sourceType; // 来源类型
    private String className; // 类名(如果来自Java)
    private String methodName; // 方法名(如果来自Java)
    private Boolean isNativeQuery; // 是否原生查询
    private Boolean isDerivedQuery; // 是否派生查询
    private Integer statementNumber; // 全局语句编号

    // 新增字段用于增强的SQL解析逻辑
    private Long taskId; // 任务ID
    private String contentHash; // SQL内容哈希
    private DdlType ddlType; // DDL详细类型(仅DDL扫描使用)
    private JavaAnnotationType javaAnnotationType; // Java注解类型
    private MybatisXmlElement mybatisXmlElement; // MyBatis XML元素类型
    private String primaryTable; // 主要操作的表名
    private List<String> affectedTables; // 影响的表列表
    private Map<String, Object> databaseObjects; // 数据库对象详情
    private Map<String, Object> extractionMetadata; // 提取元数据

    public enum SqlType {
        QUERY, // 查询
        DML, // 数据操作(INSERT/UPDATE/DELETE)
        DDL, // 数据定义(CREATE/ALTER/DROP)
        PROCEDURE, // 存储过程
        FUNCTION, // 函数
        TRIGGER // 触发器
    }

    public enum SourceType {
        MYBATIS_XML, // MyBatis XML文件
        MYBATIS_ANNOTATION, // MyBatis注解
        JPA_ANNOTATION, // JPA注解
        NATIVE_QUERY, // 原生查询
        MANUAL_INPUT, // 手动输入
        DDL_SCRIPT // DDL脚本
    }

    // 新增枚举类型
    public enum DdlType {
        CREATE_TABLE, CREATE_INDEX, CREATE_VIEW,
        CREATE_PROCEDURE, CREATE_FUNCTION, CREATE_TRIGGER,
        ALTER_TABLE, DROP_TABLE, DROP_INDEX, OTHER
    }

    public enum JavaAnnotationType {
        QUERY, MODIFYING, NATIVE_QUERY, JPQL, CRITERIA
    }

    public enum MybatisXmlElement {
        SELECT, INSERT, UPDATE, DELETE, SQL
    }
}